home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / iter8.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  3.8 KB  |  123 lines

  1.       subroutine iter8(itlim)
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine drives the newton-raphson iteration technique used to
  5. c solve the set of nonlinear circuit equations.
  6. c
  7. c spice version 2g.6  sccsid=tabinf 3/15/83
  8.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  9.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  10.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  11.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  12.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  13.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  14.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  15.      7   irowno,jcolno,nttbr,nttar,lvntmp
  16. c spice version 2g.6  sccsid=knstnt 3/15/83
  17.       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
  18.      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox,
  19.      2   pivtol,pivrel
  20. c spice version 2g.6  sccsid=cirdat 3/15/83
  21.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  22.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  23. c spice version 2g.6  sccsid=status 3/15/83
  24.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  25.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  26.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  27. c spice version 2g.6  sccsid=miscel 3/15/83
  28.       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
  29.      1  defas,rstats(50),iwidth,lwidth,nopage
  30. c spice version 2g.6  sccsid=flags 3/15/83
  31.       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
  32.      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,itl6,igoof,nogo,keof
  33. c spice version 2g.6  sccsid=blank 3/15/83
  34.       common /blank/ value(200000)
  35.       integer nodplc(64)
  36.       complex cvalue(32)
  37.       equivalence (value(1),nodplc(1),cvalue(1))
  38. c
  39. c
  40.       igoof=0
  41.       iterno=0
  42.       ndrflo=0
  43.       noncon=0
  44.       ipass=0
  45. c
  46. c  construct linear equations and check convergence
  47. c
  48.    10 ivmflg=0
  49.       call load
  50.    15 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 300
  51.       iterno=iterno+1
  52.       go to (20,30,40,60,50,60),initf
  53.    20 if(mode.ne.1) go to 22
  54.       call sizmem(nsnod,nic)
  55.       if (nic.eq.0) go to 22
  56.       if (ipass.ne.0) noncon=ipass
  57.       ipass=0
  58.    22 if (noncon.eq.0) go to 300
  59.       go to 100
  60.    30 initf=3
  61.       if(lvlcod.eq.3) lvlcod=2
  62.       ipiv=1
  63.    40 if (noncon.eq.0) initf=1
  64.       ipass=1
  65.       go to 100
  66.    50 if (iterno.gt.1) go to 60
  67.       ipiv=1
  68.       if (lvlcod.eq.3) lvlcod=2
  69.    60 initf=1
  70. c
  71. c  solve equations for next iteration
  72. c
  73.   100 if (iterno.ge.itlim) go to 200
  74.   102 call dcdcmp
  75.       if (igoof.ne.0) go to 400
  76.       if (lvlcod.eq.1) go to 105
  77.   105 call dcsol
  78.       go to 120
  79.   120 if (igoof.eq.0) go to 130
  80.       igoof=0
  81.       if (lvlcod.ne.1) lvlcod=2
  82.       ipiv=1
  83.       call load
  84.       go to 102
  85.   130 value(lvn+1)=0.0d0
  86.       do 135 i=1,nstop
  87.       j=nodplc(icswpr+i)
  88.       k=nodplc(irswpf+j)
  89.       value(lvntmp+k)=value(lvnim1+i)
  90.   135 continue
  91.       call copy8(value(lvntmp+1),value(lvnim1+1),nstop)
  92.       ntemp=noncon
  93.       noncon=0
  94.       if (ntemp.gt.0) go to 150
  95.       if (iterno.eq.1) go to 150
  96.       do 140 i=2,numnod
  97.       vold=value(lvnim1+i)
  98.       vnew=value(lvn+i)
  99.       tol=reltol*dmax1(dabs(vold),dabs(vnew))+vntol
  100.       if (dabs(vold-vnew).le.tol) go to 140
  101.       noncon=noncon+1
  102.   140 continue
  103.   150 do 160 i=1,nstop
  104.       j=nodplc(icswpr+i)
  105.       k=nodplc(irswpf+j)
  106.       value(lvnim1+i)=value(lvn+k)
  107.   160 continue
  108. c     write(iofile,151) (value(lvn+k),k=1,nstop)
  109. c 151 format(' solution: '/1p12d10.3)
  110.       go to 10
  111. c
  112. c  no convergence
  113. c
  114.   200 igoof=1
  115.   300 if (ndrflo.eq.0) go to 400
  116.       write (iofile,301) ndrflo
  117.   301 format('0warning:  underflow occurred ',i4,' time(s)')
  118. c
  119. c  finished
  120. c
  121.   400 return
  122.       end
  123.